package cn.zxh.improvement.common.core.function;


import cn.zxh.improvement.common.core.utils.Exceptions;

/**
 * 单入参函数
 *
 * @author zxh
 * @since 2023/4/26 15:45:25
 */
@FunctionalInterface
public interface FunctionWithException<T, R> extends java.util.function.Function<T, R> {

    /**
     * 将此函数应用于给定参数。
     *
     * @param arg 入参
     * @return 执行结果
     */
    @Override
    default R apply(T arg) {
        try {
            return applyWithException(arg);
        } catch (Throwable e) {
            throw Exceptions.toRuntime(e);
        }
    }

    /**
     * 执行输入参数的结果，如果发生异常，并抛出异常
     *
     * @param arg 输入参数
     * @return result
     * @throws Throwable 抛出引发的任何异常
     */
    R applyWithException(T arg) throws Throwable;
}
